# Data processing
import numpy as np
import pandas as pd
import polars as pl
# Optimisation
from pulp import (
LpMaximize,
LpMinimize,
LpProblem,
LpStatus,
lpSum,
LpVariable,
LpContinuous,
LpInteger,
value
)
# Visualisation
import plotnine as pn
import plotly.express as px
from IPython.display import display, clear_output
from mizani.formatters import comma_format, percent_format
import imageio
# Hyperparameter tuning
import optuna
import ray
from ray import train, tune
from ray.tune.search.optuna import OptunaSearch
from ray.tune.schedulers import ASHAScheduler
# Utils
import os
from tqdm.notebook import tqdm
import json
from itertools import product
import warnings
# Options
background_colour = "#F2F2F2"
pn.theme_set(
pn.theme_classic()
+ pn.theme(
text=pn.element_text(family="monospace"),
)
)
pd.set_option('display.float_format', lambda x: '%.3f' % x)
%load_ext blackcellmagicTLDR
If you’re short on time or disinterested, here’s the essence: The advantages of heuristic (meaning: including trial and error) optimisation methods is that they can deal with highly complex optimisation problem involving non-linear objective functions and still find a decent solution where classical optimisation might fail to find the optimal one. The goal of this blog post is to benchmark these methods on a problem which is quite easy to solve using linear programming, i.e. one of the classical approaches. What will be the price to pay when using heuristics instead?
As shown in the animation above, neither the genetic algorithm, nor simulated annealing were able to find the optimal solution (350k of profit), but they were very close. The computing time allowed for both (also for random search) was 30 seconds. Given the simplicity of these algorithms, I really find this result amazing and I am positively surprised by how well they did.
Problem setting: The pumped storage hydropower plant
TBD: Sketch decisions in Excalidraw
We have a week’s worth of data, so we have 168 decisions to make on the hourly time scale.
The revenue at each hour is:
\[dt_i * P_{Turbine} * Spot_i + dp_i * P_{Pump} * Spot_i\]
plant_params = {
"EFFICIENCY": 0.75,
"MAX_STORAGE_M3": 5000,
"MIN_STORAGE_M3": 0,
"TURBINE_POWER_MW": 100,
"PUMP_POWER_MW": 100,
"TURBINE_RATE_M3H": 500,
"MIN_STORAGE_MWH": 0,
"INITIAL_WATER_LEVEL_PCT": 0,
}
plant_params["INITIAL_WATER_LEVEL"] = (
plant_params["INITIAL_WATER_LEVEL_PCT"] * plant_params["MAX_STORAGE_M3"]
)
plant_params["PUMP_RATE_M3H"] = (
plant_params["TURBINE_RATE_M3H"] * plant_params["EFFICIENCY"]
)
plant_params["MAX_STORAGE_MWH"] = (
plant_params["MAX_STORAGE_M3"] / plant_params["TURBINE_RATE_M3H"]
) * plant_params["TURBINE_POWER_MW"]plant_params{'EFFICIENCY': 0.75,
'MAX_STORAGE_M3': 5000,
'MIN_STORAGE_M3': 0,
'TURBINE_POWER_MW': 100,
'PUMP_POWER_MW': 100,
'TURBINE_RATE_M3H': 500,
'MIN_STORAGE_MWH': 0,
'INITIAL_WATER_LEVEL_PCT': 0,
'INITIAL_WATER_LEVEL': 0,
'PUMP_RATE_M3H': 375.0,
'MAX_STORAGE_MWH': 1000.0}
Data
TBD describe
prices = (
pl.read_csv("01 - Data/spot_prices_utc.csv")
.with_columns(pl.col("utc_time").str.to_datetime(), pl.col("spot").forward_fill())
.drop_nulls()
)
prices.glimpse()Rows: 48166
Columns: 2
$ spot <f64> 36.99, 31.08, 29.17, 21.96, 14.96, -5.92, -6.1, -10.02, -5.71, -1.88
$ utc_time <datetime[μs, UTC]> 2017-12-31 23:00:00+00:00, 2018-01-01 00:00:00+00:00, 2018-01-01 01:00:00+00:00, 2018-01-01 02:00:00+00:00, 2018-01-01 03:00:00+00:00, 2018-01-01 04:00:00+00:00, 2018-01-01 05:00:00+00:00, 2018-01-01 06:00:00+00:00, 2018-01-01 07:00:00+00:00, 2018-01-01 08:00:00+00:00
window_size = 24*7
example = prices.filter(
pl.col("utc_time") >= pd.to_datetime("2022-01-01").tz_localize("UTC")
).head(window_size)
example.head()| spot | utc_time |
|---|---|
| f64 | datetime[μs, UTC] |
| 101.54 | 2022-01-01 00:00:00 UTC |
| 52.13 | 2022-01-01 01:00:00 UTC |
| 20.78 | 2022-01-01 02:00:00 UTC |
| 15.66 | 2022-01-01 03:00:00 UTC |
| 21.47 | 2022-01-01 04:00:00 UTC |
example.shape(168, 2)
Genetic Algorithm
Fitness Function
TBD
def evaluate_fitness(population, ps_params, prices):
# To be written according to pumped storage optimisation problem
fitness_scores = np.array([])
for parameter_combination in population:
water_level = ps_params["INITIAL_WATER_LEVEL"]
fitness_score = 0
for action, price in zip(parameter_combination, prices["spot"]):
# Pump (-1)
if action == -1:
if (
water_level + ps_params["PUMP_RATE_M3H"]
<= ps_params["MAX_STORAGE_M3"]
):
fitness_score -= ps_params["PUMP_POWER_MW"] * price
water_level += ps_params["PUMP_RATE_M3H"]
else:
fitness_score -= 100_000
# Turbine (1)
if action == 1:
if (
water_level - ps_params["TURBINE_RATE_M3H"]
>= ps_params["MIN_STORAGE_M3"]
):
fitness_score += ps_params["TURBINE_POWER_MW"] * price
water_level -= ps_params["TURBINE_RATE_M3H"]
else:
fitness_score -= 100_000
# Do nothing (0)
# Nothing happens to the fitness score and the water level
fitness_scores = np.append(fitness_scores, fitness_score)
return fitness_scoresThe Algorithm
class GA_discrete_actions:
def __init__(
self,
dna_size,
discrete_action_space,
elitism=0.25,
survival_rate=0.25,
population_size=200,
initial_mutation_rate=0.1,
final_mutation_rate=0.01,
total_generations=100
):
self.dna_size = dna_size
self.discrete_action_space = discrete_action_space
self.elitism = elitism
self.survival_rate = survival_rate
self.population_size = population_size
self.elite_size = int(self.elitism * self.population_size)
self.initial_mutation_rate = initial_mutation_rate
self.mutation_rate = initial_mutation_rate
self.final_mutation_rate = final_mutation_rate
self.total_generations = total_generations
self.best_dna = None
self.best_fitness = None
self.average_fitness = None
self.initial_population = self.__create_random_population()
def evolve(self, population, fitnesses):
assert len(population) == self.population_size
assert len(fitnesses) == len(population)
assert isinstance(population, np.ndarray)
# Sort population and fitnesses
fitness_indices = fitnesses.argsort()
sorted_fitnesses = fitnesses[fitness_indices]
sorted_population = population[fitness_indices]
# Report the best fitness and parameters
self.best_dna = sorted_population[-1]
self.best_fitness = sorted_fitnesses[-1]
self.average_fitness = np.mean(sorted_fitnesses)
# Only keep the elite of the population and get their weighting
elite = sorted_population[-self.elite_size :]
sorted_elite_fitnesses = sorted_fitnesses[-self.elite_size :]
# Calculate weighting for elite
min_fitness = sorted_elite_fitnesses.min()
max_fitness = sorted_elite_fitnesses.max()
if min_fitness == max_fitness:
# If all fitnesses are equal, set weighting to uniform distribution
fitnesses_weighting = np.full_like(
sorted_elite_fitnesses, 1 / len(sorted_elite_fitnesses), dtype=np.float32
)
else:
fitnesses_weighting = (sorted_elite_fitnesses - min_fitness) / (
max_fitness - min_fitness
)
fitnesses_weighting /= fitnesses_weighting.sum()
new_population = np.zeros((self.population_size, self.dna_size))
# Keep the population according to survival rate
survival_cutoff = int(np.floor(self.survival_rate * self.population_size))
new_population[0:survival_cutoff] = sorted_population[-survival_cutoff:]
# Crossover the elite only, rest of population doesn't cross over
for child_id in np.arange(survival_cutoff + 1, self.population_size):
i0 = np.random.choice(
a=self.elite_size, p=fitnesses_weighting, replace=True
)
i1 = np.random.choice(
a=self.elite_size, p=fitnesses_weighting, replace=True
)
new_dna = self.__crossover(elite[i0], elite[i1])
assert isinstance(new_dna, np.ndarray)
new_population[child_id] = new_dna
# Mutate the new population
for dna_id in range(self.population_size):
new_population[dna_id] = self.__mutate(new_population[dna_id])
# Adjust mutation rate: linear decay dependent on total generations
self.mutation_rate = self.mutation_rate - 1/self.total_generations * (self.initial_mutation_rate - self.final_mutation_rate)
self.mutation_rate = np.maximum(self.mutation_rate, self.final_mutation_rate)
assert new_population.shape == self.initial_population.shape
return new_population
def __create_random_population(self):
population = np.random.choice(
a=self.discrete_action_space, size=(self.population_size, self.dna_size)
)
return population
def __mutate(self, dna):
# If random dice roll (between zero and one) is less than mutation
# rate (between zero and one) then inject noise into the dna.
if np.random.random_sample() < self.mutation_rate:
# Randomly select which element to mutate and insert random integer parameters
position = np.random.choice(a=np.arange(0, len(dna)), size=1)
new_options = [x for x in self.discrete_action_space if x != dna[position]]
mutation_value = np.random.choice(a=new_options, size=1)
dna[position] = mutation_value
return dna
def __crossover(self, dna1, dna2):
assert len(dna1) == len(dna2)
# set child's DNA to be of the first parent
child = np.copy(dna1)
# replace random positions with dna from second parent
dna2_indices = np.random.randint(2, size=child.size)
indices = np.where(dna2_indices)
child[indices] = dna2[indices]
return childga = GA_discrete_actions(
dna_size=window_size,
discrete_action_space=[-1, 0, 1],
elitism=0.5,
population_size=500,
survival_rate=0.25,
initial_mutation_rate=0.1,
final_mutation_rate=0.01,
total_generations=100
)population = ga.initial_population
average_fitnesses = []
best_fitnesses = []
for generation in (pbar := tqdm(range(ga.total_generations))):
population = ga.evolve(
population=population,
fitnesses=evaluate_fitness(
population=population, ps_params=plant_params, prices=example
),
)
average_fitnesses.append(ga.average_fitness)
best_fitnesses.append(ga.best_fitness)
pbar.set_description(f"Best fitness: {best_fitnesses[-1]}")ga.best_fitness275136.0
ga.best_dnaarray([ 0., -1., -1., -1., -1., -1., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., -1.,
-1., -1., -1., -1., -1., 0., 0., 0., 0., 0., 0., -1., 0.,
0., 0., 1., 0., 0., 0., 0., 0., -1., -1., -1., -1., -1.,
0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., -1., -1., 0., 0., 0., 0.,
0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.,
0., 0., 0., 0., -1., 0., -1., -1., -1., -1., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.,
1., 0., 0., 0., 0., 1., 0., 1., 1., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1.,
0., 0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0.])
(
pn.ggplot(
data=(
pd.DataFrame(
{
"average": average_fitnesses,
"best": best_fitnesses,
"generation": np.arange(1, len(average_fitnesses) + 1),
}
)
# .tail(len(average_fitnesses)-10)
.melt(id_vars="generation")
),
mapping=pn.aes(x="generation", y="value", colour="variable"),
)
+ pn.geom_line()
+ pn.theme(figure_size=[6, 3])
# + pn.scale_y_log10()
)best_profile = (
example.to_pandas().assign(
action=ga.best_dna,
colour_id=lambda x: np.select(
[x.action == 1, x.action == 0, x.action == -1],
["pump", "nothing", "turbine"],
),
water_level=lambda x: plant_params["INITIAL_WATER_LEVEL_PCT"] * plant_params["MAX_STORAGE_M3"]
+ np.select(
[x.action == 1, x.action == -1],
[plant_params["PUMP_RATE_M3H"], -plant_params["TURBINE_RATE_M3H"]],
0,
).cumsum(),
)
)
best_profile.head()| spot | utc_time | action | colour_id | water_level | |
|---|---|---|---|---|---|
| 0 | 101.540 | 2022-01-01 00:00:00+00:00 | 0.000 | nothing | 0.000 |
| 1 | 52.130 | 2022-01-01 01:00:00+00:00 | -1.000 | turbine | -500.000 |
| 2 | 20.780 | 2022-01-01 02:00:00+00:00 | -1.000 | turbine | -1000.000 |
| 3 | 15.660 | 2022-01-01 03:00:00+00:00 | -1.000 | turbine | -1500.000 |
| 4 | 21.470 | 2022-01-01 04:00:00+00:00 | -1.000 | turbine | -2000.000 |
Tuning Hyperparameters
def genetic_algorithm_tuning(trial):
config = {
"dna_size": window_size,
"discrete_action_space": [-1, 0, 1],
"elitism": trial.suggest_float("elitism", 0.1, 0.9),
"population_size": trial.suggest_categorical("population_size", [50, 100, 500, 1000]),
"survival_rate": trial.suggest_float("survival_rate", 0.1, 0.9),
"initial_mutation_rate": trial.suggest_float("initial_mutation_rate", 0.2, 1),
"final_mutation_rate": 0.01,
"total_generations": 100,
}
ga = GA_discrete_actions(**config)
population = ga.initial_population
for _ in range(config["total_generations"]):
population = ga.evolve(
population=population,
fitnesses=evaluate_fitness(
population=population, ps_params=plant_params, prices=example
),
)
return ga.best_fitnessnp.random.seed(42)
study = optuna.create_study(direction='maximize')
study.optimize(genetic_algorithm_tuning, n_trials=1e4, timeout=60*60)study.best_paramswith open("02 - Tuning Results/ga_tuning_params.json", "w") as outfile:
json.dump(study.best_params, outfile)Final Run
So, let’s do a final run with the best hyperparameters found from tuning for a longer time period and see where we end.
with open("02 - Tuning Results/ga_tuning_params.json") as infile:
ga_params = json.load(infile)np.random.seed(42)
ga = GA_discrete_actions(
dna_size=window_size,
discrete_action_space=[-1, 0, 1],
elitism=ga_params["elitism"],
population_size=ga_params["population_size"],
survival_rate=ga_params["survival_rate"],
initial_mutation_rate=ga_params["initial_mutation_rate"],
final_mutation_rate=0.1,
total_generations=250,
)
population = ga.initial_population
params_best = None
fitness_best = None
average_fitnesses = []
best_fitnesses = []
best_solutions = []
all_fitnesses = []
for generation in (pbar := tqdm(range(ga.total_generations))):
fitnesses = evaluate_fitness(
population=population, ps_params=plant_params, prices=example
)
population = ga.evolve(
population=population,
fitnesses=fitnesses,
)
# Store historically best solution
if params_best is None or ga.best_fitness > fitness_best:
params_best = ga.best_dna
fitness_best = ga.best_fitness
# Store all solutions for animation
best_solutions.append(ga.best_dna)
all_fitnesses.append(fitnesses)
# Store history for visualisation
average_fitnesses.append(ga.average_fitness)
best_fitnesses.append(fitness_best)
pbar.set_description(f"Best fitness: {best_fitnesses[-1]:.0f}")ga.best_fitness339890.0
fitness_best339890.0
Store the best solution found for later comparison and visualisation:
actions = example.with_columns(ga_action = pl.Series(params_best))
actions.head()actions.to_pandas().to_csv("./03 - Final Run Results/actions.csv", index=False)with open('03 - Final Run Results/ga_actions.npy', 'wb') as f:
np.save(f, np.array(best_solutions))
with open('03 - Final Run Results/ga_best_fitnesses.npy', 'wb') as f:
np.save(f, np.array(best_fitnesses))
with open('03 - Final Run Results/ga_all_fitnesses.npy', 'wb') as f:
np.save(f, np.array(all_fitnesses))Simulated Annealing
The Energy Function
def profit(actions, ps_params, prices):
water_level = ps_params["INITIAL_WATER_LEVEL"]
profit = 0
for action, price in zip(actions, prices["spot"]):
# Pump (-1)
if action == -1:
if (
(water_level + ps_params["PUMP_RATE_M3H"])
<= ps_params["MAX_STORAGE_M3"]
):
profit -= ps_params["PUMP_POWER_MW"] * price
water_level += ps_params["PUMP_RATE_M3H"]
else:
profit -= 1e6
# Turbine (1)
if action == 1:
if (
(water_level - ps_params["TURBINE_RATE_M3H"])
>= ps_params["MIN_STORAGE_M3"]
):
profit += ps_params["TURBINE_POWER_MW"] * price
water_level -= ps_params["TURBINE_RATE_M3H"]
else:
profit -= 1e6
return profit- change current solution slightly (neighbour state)
- accept new state with probability that depends on the energy of both states and on temperature parameters
- smaller energy is better than larger energy
- probability function must be positive even if the new state has higher energy (is worse)
- this helps escape local optima
(
pd.DataFrame({"iter": np.arange(0, 100)}).assign(
temp=lambda x: 1 - (x.iter + 1) / 100,
acceptance_prob=lambda x: np.exp(
- (0.5) / (x.temp + 0.0001)
),
)
.plot(x="temp", y="acceptance_prob", ylim=[0,1])
)flip_size = 1
iterations = 100
initial_temp = 10000
temp_decay = 0.5
params = np.random.choice([-1,0,1], size=example.shape[0])
params_best = None
energy_best = None
for i in (pbar := tqdm(range(iterations))):
# Modify temperature parameters
# temperature = initial_temp/(i + 1)
temperature = initial_temp - i/iterations * initial_temp
# Generate random neighbour by randomly flipping actions
params_new = params.copy()
for _ in range(flip_size):
idx = np.random.choice(np.arange(0, len(params)))
new_options = [x for x in [-1,0,1] if x != params[idx]]
params_new[idx] = np.random.choice(new_options)
# Calculate energy for old and new state
energy_old = -profit(actions=params, prices=prices, ps_params=plant_params)
energy_new = -profit(actions=params_new, prices=prices, ps_params=plant_params)
# Store best solution
if params_best is None or energy_new < energy_best:
params_best = params_new
energy_best = energy_new
# Calculate acceptance probability
if energy_new <= energy_old:
params = params_new
else:
acceptance_prob = np.exp(-(energy_new - energy_old)/(temperature + 1e-8))
if np.random.uniform() < acceptance_prob:
params = params_new
pbar.set_description(f"Profit: {-energy_old}")Tuning Hyperparameters
def simulated_annealing(config, tune_mode=False):
params = np.random.choice([-1,0,1], size=example.shape[0])
params_best = None
energy_best = None
for i in (pbar := tqdm(range(config["iterations"]))):
# Linear temperature decay (easier to scale to larger number of iterations later)
temperature = config["initial_temp"] - i/config["iterations"] * config["initial_temp"]
# Generate random neighbour by randomly flipping actions
params_new = params.copy()
for _ in range(config["flip_size"]):
idx = np.random.choice(np.arange(0, len(params)))
new_options = [x for x in [-1,0,1] if x != params[idx]]
params_new[idx] = np.random.choice(new_options)
# Calculate energy for old and new state
energy_old = -profit(actions=params, prices=example, ps_params=plant_params)
energy_new = -profit(actions=params_new, prices=example, ps_params=plant_params)
if energy_best is None:
params_best = params
energy_best = energy_old
# Calculate acceptance probability
# If solution is better than previous accept immediately
if energy_new < energy_old:
# Solution is better than previous, but is it better than best
if energy_new < energy_best:
params_best = params_new.copy()
energy_best = energy_new
params = params_new.copy()
# If solution isn't better than previous, accept maybe
else:
acceptance_prob = np.exp(-(energy_new - energy_old)/(temperature + 1e-8))
if np.random.uniform() < acceptance_prob:
params = params_new.copy()
if tune_mode:
train.report({"energy": energy_best})
else:
pbar.set_description(f"Profit: {-energy_best:.2f}")
if not tune_mode:
return params_best# Need this line for locally defined modules to work with ray
# ray.init(runtime_env={"working_dir": "."}, ignore_reinit_error=True)
np.random.seed(42)
analysis = tune.run(
tune.with_parameters(
simulated_annealing,
tune_mode=True,
),
config={
"iterations": 1000,
"initial_temp": tune.uniform(0.01, 10),
"flip_size": tune.randint(1, 50),
},
metric="energy",
mode="min",
local_dir="tune_results",
name="SA",
search_alg=OptunaSearch(),
time_budget_s=60*60,
num_samples=-1,
trial_dirname_creator=lambda trial: f"{trial.trainable_name}_{trial.trial_id}",
)f"Best Profit: {-analysis.best_result['energy']:.2f}"top_runs = analysis.dataframe().sort_values("energy", ascending=True).head(10)["trial_id"].to_list()
fig = px.line(
data_frame=pd.concat(analysis.trial_dataframes.values()).query(
"trial_id in @top_runs"
),
x="training_iteration",
y="energy",
color="trial_id",
)
fig.show()analysis.best_configwith open("02 - Tuning Results/sa_tuning_params.json", "w") as outfile:
json.dump(analysis.best_config, outfile)Final Run
Here we need to adjust the hyperparameter of temperature decay
TBD: Explain why the formula doesn’t work (float precision) in practice
init_new = init_old * d^x_old / d^x_new
with open("02 - Tuning Results/sa_tuning_params.json") as infile:
sa_params = json.load(infile)
old_sa_params = sa_params.copy()
old_sa_params{'iterations': 1000, 'initial_temp': 7.629941060448957, 'flip_size': 2}
sa_params["iterations"] = 75_000
sa_params["initial_temp"] *= sa_params["iterations"] / old_sa_params["iterations"]
sa_params{'iterations': 75000, 'initial_temp': 572.2455795336717, 'flip_size': 2}
np.random.seed(42)
params = np.random.choice([-1,0,1], size=example.shape[0])
params_best = None
energy_best = None
best_profits = []
best_solutions = []
all_profits = []
for i in (pbar := tqdm(range(sa_params["iterations"]))):
# Modify temperature parameters
# temperature = initial_temp/(i + 1)
temperature = sa_params["initial_temp"] - i/sa_params["iterations"] * sa_params["initial_temp"]
# Generate random neighbour by randomly flipping actions
params_new = params.copy()
for _ in range(sa_params["flip_size"]):
idx = np.random.choice(np.arange(0, len(params)))
new_options = [x for x in [-1,0,1] if x != params[idx]]
params_new[idx] = np.random.choice(new_options)
# Calculate energy for old and new state
energy_old = -profit(actions=params, prices=example, ps_params=plant_params)
all_profits.append(-energy_old)
energy_new = -profit(actions=params_new, prices=example, ps_params=plant_params)
if energy_best is None:
params_best = params
energy_best = energy_old
# Calculate acceptance probability
# If solution is better than previous accept immediately
if energy_new < energy_old:
# Solution is better than previous, but is it better than best
if energy_new < energy_best:
params_best = params_new.copy()
energy_best = energy_new
params = params_new.copy()
# If solution isn't better than previous, accept maybe
else:
acceptance_prob = np.exp(-(energy_new - energy_old)/(temperature + 1e-8))
if np.random.uniform() < acceptance_prob:
params = params_new.copy()
# Save interim results
best_solutions.append(params_best)
best_profits.append(-energy_best)
pbar.set_description(f"Profit: {-energy_best:,.0f} Temperature: {temperature:,.2f}")profit(actions=params, prices=example, ps_params=plant_params)317164.0
actions = (
pl.read_csv("./03 - Final Run Results/actions.csv", try_parse_dates=True)
.select("utc_time", "spot", "ga_action")
.with_columns(pl.col("ga_action").cast(pl.Int64))
.with_columns(sa_action = pl.Series(params).cast(pl.Int64))
)
actions.to_pandas().to_csv("./03 - Final Run Results/actions.csv", index=False)
actions.head()with open('03 - Final Run Results/sa_actions.npy', 'wb') as f:
np.save(f, np.array(best_solutions))
with open('03 - Final Run Results/sa_best_profits.npy', 'wb') as f:
np.save(f, np.array(best_profits))
with open('03 - Final Run Results/sa_all_profits.npy', 'wb') as f:
np.save(f, np.array(all_profits))Brute Force Search
np.random.seed(42)
params_best = None
profit_best = None
best_profits = []
best_solutions = []
for i in (pbar := tqdm(range(150_000))):
# Generate random candidate
params = np.random.choice(a=[-1, 0, 1], size=example.shape[0])
# Calculate profit
current_profit = profit(actions=params, prices=example, ps_params=plant_params)
# Check if it's historically best
if profit_best is None or current_profit > profit_best:
params_best = params.copy()
profit_best = current_profit
# Save interim results
best_solutions.append(params_best)
best_profits.append(profit_best)
pbar.set_description(f"Profit: {profit_best:.2f}")actions = (
pl.read_csv("./03 - Final Run Results/actions.csv", try_parse_dates=True)
.select("utc_time", "spot", "ga_action", "sa_action")
.with_columns(pl.col("ga_action").cast(pl.Int64))
.with_columns(pl.col("sa_action").cast(pl.Int64))
.with_columns(bf_action = pl.Series(params_best).cast(pl.Int64))
)
actions.to_pandas().to_csv("./03 - Final Run Results/actions.csv", index=False)
actions.head()with open('03 - Final Run Results/bf_actions.npy', 'wb') as f:
np.save(f, np.array(best_solutions))
with open('03 - Final Run Results/bf_best_profits.npy', 'wb') as f:
np.save(f, np.array(best_profits))Mixed Integer Linear Programming
# Create names for decision variables
dec_vars = range(example.shape[0])
# The cost/revenue associated with each decision variable is the
# spot price
spot = dict(zip(dec_vars, example["spot"].to_list()))
# Decision variables
dp = LpVariable.dicts("pump_dummy", dec_vars, 0, 1, cat="Binary")
dt = LpVariable.dicts("turbine_dummy", dec_vars, 0, 1, cat="Binary")
# State Variables
water_level = LpVariable.dict(
"water_level",
dec_vars,
plant_params["MIN_STORAGE_M3"],
plant_params["MAX_STORAGE_M3"],
cat="Continuous",
)
# Initialise Model
model = LpProblem(name="pumped_storage_optimisation", sense=LpMaximize)
# Add objective function
model += (
lpSum(
[
dt[i] * plant_params["TURBINE_POWER_MW"] * example["spot"][i]
- dp[i] * plant_params["PUMP_POWER_MW"] * example["spot"][i]
for i in dec_vars
]
),
"revenue",
)
# Add constraints
for i in dec_vars:
# Don't pump and turbine at the same time
model += (dt[i] + dp[i] <= 1, f"no_simultaneous_pump_and_turbine_upper_{i}")
model += (dt[i] + dp[i] >= 0, f"no_simultaneous_pump_and_turbine_lower_{i}")
# Add constraint to update water level
if i == 0:
model += (
water_level[i]
== plant_params["INITIAL_WATER_LEVEL"]
+ dp[i] * plant_params["PUMP_RATE_M3H"]
- dt[i] * plant_params["TURBINE_RATE_M3H"],
f"initial_water_level_{i}",
)
else:
# Update water level based on previous level, pumping, and turbine action
model += (
water_level[i]
== water_level[i - 1]
+ dp[i] * plant_params["PUMP_RATE_M3H"]
- dt[i] * plant_params["TURBINE_RATE_M3H"],
f"water_level_update_{i}",
)
# Add constraints for water level boundaries
model += (water_level[i] <= plant_params["MAX_STORAGE_M3"], f"max_storage_{i}")
model += (water_level[i] >= plant_params["MIN_STORAGE_M3"], f"min_storage_{i}")
# Solve the model
model.solve()1
LpStatus[model.status]'Optimal'
model.objective.value()350291.0
best_profile = (
pd.DataFrame(
{
"variable": [v.name for v in model.variables()],
"value": [v.value() for v in model.variables()],
}
)
.assign(
name=lambda x: x["variable"].apply(lambda r: r.rsplit("_", 1)[0]),
hour=lambda x: x["variable"].apply(lambda r: r.rsplit("_", 1)[1]).astype(int),
)
.drop("variable", axis=1)
.pivot(index="hour", columns="name", values="value")
.reset_index()
.rename_axis(None, axis=1)
.sort_values("hour")
.assign(
action=lambda x: np.select(
condlist=[
x["pump_dummy"] == 1,
x["turbine_dummy"] == 1,
],
choicelist=[
-1,
1,
],
default=0,
),
colour_id=lambda x: np.select(
condlist=[
x["pump_dummy"] == 1,
x["turbine_dummy"] == 1,
],
choicelist=[
"pump",
"turbine",
],
default="nothing",
),
utc_time=pd.to_datetime(example["utc_time"]),
spot=example["spot"].to_list(),
)
.drop(["pump_dummy", "turbine_dummy", "hour"], axis=1)
)
best_profile.describe()actions = (
pl.read_csv("./03 - Final Run Results/actions.csv", try_parse_dates=True)
.select("utc_time", "spot", "ga_action", "sa_action", "bf_action")
.with_columns(pl.col("ga_action").cast(pl.Int64))
.with_columns(pl.col("sa_action").cast(pl.Int64))
.with_columns(pl.col("bf_action").cast(pl.Int64))
.with_columns(milp_action = pl.Series(best_profile["action"]).cast(pl.Int64))
)
actions.to_pandas().to_csv("./03 - Final Run Results/actions.csv", index=False)
actions.head()Comparison of Best Solutions
actions = (
pl.read_csv("./03 - Final Run Results/actions.csv", try_parse_dates=True)
.with_columns(
pl.col("ga_action").cast(pl.Int64),
pl.col("sa_action").cast(pl.Int64),
pl.col("bf_action").cast(pl.Int64),
pl.col("milp_action").cast(pl.Int64),
)
)
actions.head()| utc_time | spot | ga_action | sa_action | bf_action | milp_action |
|---|---|---|---|---|---|
| datetime[μs, UTC] | f64 | i64 | i64 | i64 | i64 |
| 2022-01-01 00:00:00 UTC | 101.54 | 0 | 0 | -1 | 0 |
| 2022-01-01 01:00:00 UTC | 52.13 | -1 | -1 | 0 | -1 |
| 2022-01-01 02:00:00 UTC | 20.78 | -1 | -1 | -1 | -1 |
| 2022-01-01 03:00:00 UTC | 15.66 | -1 | -1 | 0 | -1 |
| 2022-01-01 04:00:00 UTC | 21.47 | -1 | -1 | 1 | -1 |
algos = ["ga_action", "sa_action", "bf_action", "milp_action"]
algo_names = ["Genetic Algorithm", "Simulated Annealing", "Random Search", "Mixed Integer Linear Programming"]for idx, algo in enumerate(algos):
best_profile = (
actions.select("utc_time", "spot", algo)
.rename({algo: "action"})
.with_columns(
colour_id=pl.when(pl.col("action") == -1)
.then(pl.lit("pump"))
.when(pl.col("action") == 1)
.then(pl.lit("turbine"))
.otherwise(pl.lit("Nothing"))
)
.with_columns(
water_level=plant_params["INITIAL_WATER_LEVEL_PCT"]
+ (
pl.when(pl.col("action") == -1)
.then(plant_params["PUMP_RATE_M3H"])
.when(pl.col("action") == 1)
.then(-plant_params["TURBINE_RATE_M3H"])
.otherwise(0)
.cum_sum()
)
)
.to_pandas()
.sort_values("utc_time")
)
best_profit = profit(actions=best_profile["action"], prices=example, ps_params=plant_params)
# Operating Profile
fig = (
pn.ggplot(
data=best_profile.assign(
spot=lambda x: (x.spot - x.spot.mean()) / x.spot.std()
),
mapping=pn.aes(x="utc_time"),
)
+ pn.geom_line(pn.aes(y="spot"))
+ pn.geom_point(pn.aes(y="spot"))
+ pn.geom_col(pn.aes(y="action", fill="colour_id"), alpha=0.5)
+ pn.labs(title=f"Best found operating profile for {algo_names[idx]}: {best_profit:,.0f} CHF")
+ pn.scale_fill_manual(values=["black", "firebrick", "midnightblue"])
+ pn.geom_hline(yintercept=0, linetype="dotted")
# + pn.scale_x_date(date_breaks="1 month", date_labels="%d/%m")
+ pn.theme(figure_size=[10, 3], legend_title=pn.element_blank())
)
display(fig)
# Lake level
fig = (
pn.ggplot(data=best_profile, mapping=pn.aes(x="utc_time", y="water_level"))
+ pn.geom_line()
+ pn.labs(title=f"Lake Levels for {algo_names[idx]}")
+ pn.geom_hline(yintercept=plant_params["MAX_STORAGE_M3"], linetype="dotted")
+ pn.geom_hline(yintercept=plant_params["MIN_STORAGE_M3"], linetype="dotted")
# + pn.scale_x_date(date_breaks="1 month", date_labels="%d/%m")
# + pn.coord_cartesian(ylim=[0, best_profile.water_level.max()*1.1])
+ pn.theme(figure_size=[10, 3], legend_title=pn.element_blank())
)
display(fig)
Conclusion
TBD
Animation
If you made it this far, thank you very much for reading! This section of the blog is for the interested who want to know how I made the animation at the start of the blog.
I wanted to show:
- The current state of the optimisation at every stage for SA and GA
- The progress over the allowed time slot (30 seconds)
Static Plot Generation
GA All Fitnesses
with open("./03 - Final Run Results/ga_all_fitnesses.npy", "rb") as f:
ga_all_fitnesses = np.load(f)
np.random.seed(1)
ga_all_fitnesses_df = (
pl.DataFrame(
ga_all_fitnesses, schema=[f"{i}" for i in range(ga_all_fitnesses.shape[0])]
)
.unpivot(variable_name="generation")
.with_columns(pl.col("generation").cast(pl.Int64))
.sample(fraction=1)
)# warnings.filterwarnings('ignore')
plot_data = None
for idx in tqdm(range(ga_all_fitnesses.shape[0])):
# Filter data
plot_data = (
pl.DataFrame(
ga_all_fitnesses, schema=[f"{i}" for i in range(ga_all_fitnesses.shape[0])]
)
.unpivot(variable_name="generation")
.with_columns(pl.col("generation").cast(pl.Int64))
.filter(
(pl.col("generation") <= idx)
# & (pl.col("generation") >= idx - 50)
)
.with_columns(
# shading=((pl.col("generation") + 1) / (idx + 1)) ** 1e600
shading=pl.when(pl.col("generation") == idx).then(pl.lit(1)).otherwise(pl.lit(0.01))
)
)
# print(plot_data)
# Plot data
fig = (
pn.ggplot(
data=plot_data.group_by("generation").head(50),
mapping=pn.aes(x="generation", y="value"),
)
+ pn.geom_point(pn.aes(alpha="shading"))
+ pn.labs(title=f"Genetic Algorithm: Population At Generation {idx}",
y = "profit", x = "generation")
+ pn.scale_x_continuous(limits=(0, ga_all_fitnesses.shape[0]))
+ pn.scale_y_continuous(
labels=comma_format(), limits=[-4e5, 4e5]
)
# + pn.theme_light()
+ pn.theme(
figure_size=[7, 7 * ((5/3) / (4/2))], legend_title=pn.element_blank(),
legend_position="none"
)
)
fig.save(filename = f"./04 - Animation/GA_fitnesses/generation_{idx:03d}", height=7 * ((5/3) / (4/2)), width=7, dpi=300)
# display(fig)
# clear_output(wait=True)
# breakSA All Fitnesses
with open("./03 - Final Run Results/sa_all_profits.npy", "rb") as f:
sa_all_profits = np.load(f)Reduce to 1000 frames to keep the folder manageable:
max_frames = 1000
plot_data = (
pl.DataFrame(pl.Series(values=sa_all_profits, name="profit")).with_columns(pl.Series(np.arange(0, len(sa_all_profits))).alias("iteration"))
.with_columns(((pl.col("iteration") / len(sa_all_profits)) * max_frames).floor().alias("frame"))
.group_by("frame")
.tail(1)
.sort("frame")
)
print(plot_data.shape)
plot_data.head()(1000, 3)
| frame | profit | iteration |
|---|---|---|
| f64 | f64 | i32 |
| 0.0 | -1.195824e6 | 74 |
| 1.0 | -1.106363e6 | 149 |
| 2.0 | -63354.0 | 224 |
| 3.0 | 9623.0 | 299 |
| 4.0 | 35701.0 | 374 |
for idx in tqdm(range(max_frames)):
# Plot data
fig = (
pn.ggplot(
data=plot_data.filter(pl.col("frame") <= idx),
mapping=pn.aes(x="iteration", y="profit"),
)
+ pn.geom_line()
+ pn.labs(
title=f"Simulated Annealing: Solution At Iteration {plot_data.filter(pl.col('frame') == idx)['iteration'][0]}",
y="profit",
x="iteration",
)
+ pn.scale_x_continuous(
labels=comma_format(), limits=(0, plot_data["iteration"].max())
)
+ pn.scale_y_continuous(labels=comma_format())
+ pn.coord_cartesian(
ylim=[
plot_data.filter(pl.col("frame") <= idx).tail(500)["profit"].min(),
plot_data.filter(pl.col("frame") <= idx).tail(500)["profit"].max(),
]
)
+ pn.theme(
figure_size=[7, 7 * ((5/3) / (4/2))], legend_title=pn.element_blank(), legend_position="none"
)
)
fig.save(filename = f"./04 - Animation/SA_fitnesses/iteration_{idx:04d}", height=7 * ((5/3) / (4/2)), width=7, dpi=300)
# display(fig)
# clear_output(wait=True)
# breakGA Profiles
with open("./03 - Final Run Results/ga_actions.npy", "rb") as f:
ga_actions = np.load(f)for idx in tqdm(range(ga_actions.shape[0])):
plot_data = (
example.select("utc_time", "spot")
.with_columns(action = pl.Series(ga_actions[idx]))
.with_columns(
colour_id=pl.when(pl.col("action") == -1)
.then(pl.lit("pump"))
.when(pl.col("action") == 1)
.then(pl.lit("turbine"))
.otherwise(pl.lit("Nothing"))
)
.with_columns(
water_level=plant_params["INITIAL_WATER_LEVEL_PCT"]
+ (
pl.when(pl.col("action") == -1)
.then(plant_params["PUMP_RATE_M3H"])
.when(pl.col("action") == 1)
.then(-plant_params["TURBINE_RATE_M3H"])
.otherwise(0)
.cum_sum()
)
)
.to_pandas()
.sort_values("utc_time")
)
# Operating Profile
fig = (
pn.ggplot(
data=plot_data.assign(
spot=lambda x: (x.spot - x.spot.mean()) / x.spot.std()
),
mapping=pn.aes(x="utc_time"),
)
+ pn.geom_line(pn.aes(y="spot"))
+ pn.geom_point(pn.aes(y="spot"))
+ pn.geom_col(pn.aes(y="action", fill="colour_id"), alpha=0.5)
+ pn.labs(title=f"Genetic Algorithm: Best Profile At Generation {idx}", x = " ")
+ pn.scale_fill_manual(values=["black", "firebrick", "midnightblue"])
+ pn.geom_hline(yintercept=0, linetype="dotted")
# + pn.scale_x_date(date_breaks="1 month", date_labels="%d/%m")
+ pn.theme(
figure_size=[7, 7 * ((5/3) / (4/2))],
legend_title=pn.element_blank(),
legend_position="none",
axis_text_y=pn.element_blank(),
)
)
fig.save(filename = f"./04 - Animation/GA_profiles/generation_{idx:04d}", height=7 * ((5/3) / (4/2)), width=7, dpi=300)
# display(fig)
# clear_output(wait=True)
# breakSA Profiles
with open("./03 - Final Run Results/sa_actions.npy", "rb") as f:
sa_actions = np.load(f)max_frames = 1000
frames = [i for i in range(len(sa_actions)) if i % int(len(sa_actions)/max_frames) == 0]for idx in tqdm(range(max_frames)):
plot_data = (
example.select("utc_time", "spot")
.with_columns(action=pl.Series(sa_actions[frames[idx]]))
.with_columns(
colour_id=pl.when(pl.col("action") == -1)
.then(pl.lit("pump"))
.when(pl.col("action") == 1)
.then(pl.lit("turbine"))
.otherwise(pl.lit("Nothing"))
)
.with_columns(
water_level=plant_params["INITIAL_WATER_LEVEL_PCT"]
+ (
pl.when(pl.col("action") == -1)
.then(plant_params["PUMP_RATE_M3H"])
.when(pl.col("action") == 1)
.then(-plant_params["TURBINE_RATE_M3H"])
.otherwise(0)
.cum_sum()
)
)
.to_pandas()
.sort_values("utc_time")
)
# Operating Profile
fig = (
pn.ggplot(
data=plot_data.assign(
spot=lambda x: (x.spot - x.spot.mean()) / x.spot.std()
),
mapping=pn.aes(x="utc_time"),
)
+ pn.geom_line(pn.aes(y="spot"))
+ pn.geom_point(pn.aes(y="spot"))
+ pn.geom_col(pn.aes(y="action", fill="colour_id"), alpha=0.5)
+ pn.labs(
title=f"Simulated Annealing: Best Profile At Iteration {frames[idx]}", x=" "
)
+ pn.scale_fill_manual(values=["black", "firebrick", "midnightblue"])
+ pn.geom_hline(yintercept=0, linetype="dotted")
# + pn.scale_x_date(date_breaks="1 month", date_labels="%d/%m")
+ pn.theme(
figure_size=[7, 7 * ((5/3) / (4/2))],
legend_title=pn.element_blank(),
legend_position="none",
axis_text_y=pn.element_blank(),
)
)
fig.save(filename = f"./04 - Animation/SA_profiles/generation_{idx:04d}", height=7 * ((5/3) / (4/2)), width=7, dpi=300)
# display(fig)
# clear_output(wait=True)
# breakBest Profits
with open("./03 - Final Run Results/ga_best_fitnesses.npy", "rb") as f:
ga_profits = np.load(f)with open("./03 - Final Run Results/sa_best_profits.npy", "rb") as f:
sa_profits = np.load(f)with open("./03 - Final Run Results/bf_best_profits.npy", "rb") as f:
bf_profits = np.load(f)len(ga_profits)250
len(sa_profits)75000
len(bf_profits)150000
max_frames = len(ga_profits)
sa_frames = [i-1 for i in range(1, len(sa_profits) + 1) if i % int(len(sa_profits)/max_frames) == 0]
bf_frames = [i-1 for i in range(1, len(bf_profits) + 1) if i % int(len(bf_profits)/max_frames) == 0]plot_data = pl.DataFrame(
{
"generation": np.arange(0, len(ga_profits)),
"Genetic Algorithm": ga_profits,
"Simulated Annealing": sa_profits[sa_frames],
"Brute Force Random Search": bf_profits[bf_frames],
}
).unpivot(index="generation")
plot_data.head()| generation | variable | value |
|---|---|---|
| i32 | str | f64 |
| 0 | "Genetic Algorithm" | -177561.0 |
| 1 | "Genetic Algorithm" | -19350.0 |
| 2 | "Genetic Algorithm" | -12588.0 |
| 3 | "Genetic Algorithm" | -12588.0 |
| 4 | "Genetic Algorithm" | 23985.0 |
#| eval: false
for idx in tqdm(range(plot_data["generation"].unique().shape[0])):
# Operating Profile
fig = (
pn.ggplot(
data=plot_data.filter(pl.col("generation") <= idx),
mapping=pn.aes(x="generation", y="value", colour="variable"),
)
+ pn.geom_line()
+ pn.labs(y = "Best Found Profit", x="Time")
+ pn.scale_x_continuous(limits=[0, plot_data["generation"].max()])
+ pn.scale_y_continuous(labels=comma_format())
+ pn.coord_cartesian(
ylim=[
plot_data.filter(pl.col("generation") <= idx).tail(20)["value"].min(),
plot_data["value"].max(),
]
)
# + pn.scale_fill_manual(values=["black", "firebrick", "midnightblue"])
+ pn.theme(
figure_size=[10, 10 * ((5/3) / 4)],
legend_title=pn.element_blank(),
axis_text_x=pn.element_blank(),
# legend_position="none",
)
)
fig.save(filename = f"./04 - Animation/Profits/generation_{idx:03d}", height=10 * ((5/3) / 4), width=10, dpi=300)
# display(fig)
# clear_output(wait=True)
# breakC:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_000
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\geoms\geom_path.py:113: PlotnineWarning: geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_001
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_002
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_003
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_004
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_005
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_006
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_007
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_008
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_009
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_010
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_011
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_012
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_013
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_014
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_015
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_016
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_017
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_018
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_019
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_020
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_021
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_022
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_023
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_024
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_025
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_026
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_027
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_028
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_029
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_030
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_031
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_032
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_033
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_034
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_035
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_036
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_037
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_038
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_039
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_040
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_041
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_042
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_043
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_044
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_045
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_046
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_047
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_048
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_049
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_050
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_051
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_052
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_053
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_054
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_055
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_056
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_057
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_058
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_059
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_060
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_061
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_062
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_063
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_064
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_065
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_066
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_067
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_068
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_069
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_070
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_071
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_072
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_073
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_074
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_075
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_076
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_077
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_078
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_079
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_080
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_081
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_082
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_083
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_084
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_085
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_086
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_087
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_088
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_089
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_090
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_091
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_092
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_093
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_094
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_095
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_096
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_097
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_098
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_099
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_100
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_101
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_102
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_103
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_104
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_105
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_106
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_107
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_108
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_109
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_110
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_111
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_112
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_113
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_114
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_115
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_116
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_117
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_118
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_119
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_120
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_121
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_122
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_123
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_124
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_125
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_126
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_127
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_128
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_129
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_130
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_131
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_132
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_133
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_134
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_135
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_136
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_137
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_138
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_139
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_140
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_141
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_142
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_143
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_144
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_145
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_146
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_147
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_148
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_149
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_150
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_151
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_152
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_153
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_154
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_155
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_156
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_157
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_158
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_159
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_160
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_161
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_162
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_163
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_164
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_165
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_166
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_167
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_168
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_169
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_170
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_171
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_172
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_173
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_174
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_175
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_176
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_177
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_178
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_179
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_180
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_181
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_182
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_183
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_184
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_185
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_186
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_187
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_188
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_189
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_190
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_191
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_192
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_193
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_194
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_195
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_196
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_197
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_198
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_199
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_200
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_201
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_202
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_203
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_204
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_205
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_206
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_207
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_208
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_209
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_210
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_211
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_212
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_213
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_214
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_215
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_216
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_217
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_218
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_219
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_220
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_221
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_222
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_223
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_224
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_225
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_226
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_227
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_228
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_229
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_230
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_231
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_232
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_233
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_234
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_235
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_236
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_237
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_238
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_239
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_240
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_241
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_242
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_243
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_244
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_245
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_246
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_247
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_248
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:606: PlotnineWarning: Saving 10 x 4.166666666666667 in image.
C:\Users\mathi\miniconda3\envs\general\Lib\site-packages\plotnine\ggplot.py:607: PlotnineWarning: Filename: ./04 - Animation/Profits/generation_249
Video Generation
I will create videos from the raw plots and later edit them together in a video editing program manually for the final animation.
def generate_video(image_path, video_path, fps):
# Get list of PNG files sorted
file_names = sorted([f for f in os.listdir(image_path) if f.endswith('.png')])
writer = imageio.get_writer(video_path, fps=fps)
# Read PNG files and append to images list
for file_name in file_names:
file_path = os.path.join(image_path, file_name)
im = imageio.v2.imread(file_path)
writer.append_data(im)
writer.close()GA All profits
generate_video(
image_path="./04 - Animation/GA_fitnesses/",
video_path="./04 - Animation/ga_fitnesses.mp4",
fps=15
)SA All Profits
generate_video(
image_path="./04 - Animation/SA_fitnesses/",
video_path="./04 - Animation/sa_fitnesses.mp4",
fps=60
)GA Profiles
generate_video(
image_path="./04 - Animation/GA_profiles/",
video_path="./04 - Animation/ga_profiles.mp4",
fps=15
)SA Profiles
generate_video(
image_path="./04 - Animation/SA_profiles/",
video_path="./04 - Animation/sa_profiles.mp4",
fps=60
)Best Profits
generate_video(
image_path="./04 - Animation/Profits/",
video_path="./04 - Animation/best_profits.mp4",
fps=15
)